package com.bidv.util;

import com.bidv.BO.PaginationBO;

public class Pagination {

	private PaginationBO config = new PaginationBO();

	public void init(PaginationBO paginationBO) {
		int middle = 1;

		config = paginationBO;
		/*
		 * config.setCurrentPage(paginationBO.getCurrentPage());
		 * config.setTotalRecord(paginationBO.getTotalRecord());
		 * config.setTotalPage(paginationBO.getTotalPage());
		 * config.setLimit(paginationBO.getLimit());
		 * config.setStart(paginationBO.getStart());
		 * config.setLinkFull(paginationBO.getLinkFull());
		 * config.setLinkFirst(paginationBO.getLinkFirst());
		 * config.setRange(paginationBO.getRange());
		 * config.setMin(paginationBO.getMin());
		 * config.setMax(paginationBO.getMax());
		 */

		/*
		 * Kiểm tra thông số limit truyền vào có nhỏ hơn 0 hay không? Nếu nhỏ
		 * hơn thì gán cho limit = 1,
		 */
		if (config.getLimit() < 0) {
			config.setLimit(1);
		}

		/*
		 * Tính total page, công tức tính tổng số trang như sau: total_page =
		 * ciel(total_record/limit). lam tron len
		 */
		config.setTotalPage((int) Math.ceil(config.getTotalRecord()
				.doubleValue() / config.getLimit()));
		/*
		 * Sau khi có tổng số trang ta kiểm tra xem nó có nhỏ hơn 0 hay không
		 * nếu nhỏ hơn 0 thì gán nó băng 1 ngay. Vì mặc định tổng số trang luôn
		 * bằng 1
		 */

		if (config.getTotalPage() <= 0) {
			config.setTotalPage(1);
		}

		/*
		 * Trang hiện tại sẽ rơi vào một trong các trường hợp sau: - Nếu người
		 * dùng truyền vào số trang nhỏ hơn 1 thì ta sẽ gán nó = 1 - Nếu trang
		 * hiện tại người dùng truyền vào lớn hơn tổng số trang thì ta gán nó
		 * bằng tổng số trang Đây là vấn đề giúp web chạy trơn tru hơn, vì đôi
		 * khi người dùng cố ý thay đổi tham số trên url nhằm kiểm tra lỗi web
		 * của chúng ta
		 */
		if (config.getCurrentPage() < 1) {
			config.setCurrentPage(1);
		}

		if (config.getCurrentPage() > config.getTotalPage()) {
			config.setCurrentPage(config.getTotalPage());
		}

		/*
		 * Tính start, Như bạn biết trong mysql truy vấn sẽ có limit và start
		 * Muốn tính start ta phải dựa vào số trang hiện tại và số limit trên
		 * mỗi trang và áp dụng công tức start = (current_page - 1)*limit
		 */

		config.setStart((config.getCurrentPage() - 1) * config.getLimit());

		/*
		 * Bây giờ ta tính số trang ta show ra trang web Như bạn biết với những
		 * website có data lớn thì số trang có thể lên tới hàng trăm trang,
		 * chẵng nhẽ ta show hết cả 100 trang? Nên trong bài này tôi hướng dẫn
		 * bạn show trong một khoảng nào đó (range) giống website freetuts.net
		 * vậy
		 */

		// Trước tiên tính middle, đây chính là số nằm giữa trong khoảng tổng số
		// trang
		// mà bạn muốn hiển thị ra màn hình
		middle = (int) Math.ceil(config.getRange().doubleValue() / 2);

		// Ta sẽ lâm vào các trường hợp như bên dưới
		// Trong trường hợp này thì nếu tổng số trang mà bé hơn range
		// thì ta show hết luôn, không cần tính toán làm gì
		// tức là gán min = 1 và max = tổng số trang luôn
		if (config.getTotalPage() < config.getRange()) {
			config.setMin(1);
			config.setMax(config.getTotalPage());
		} else {
			// Ta sẽ gán min = current_page - middle + 1
			config.setMin(config.getCurrentPage() - middle + 1);
			// Ta sẽ gán max = current_page + middle - 1
			config.setMax(config.getCurrentPage() + middle - 1);

			// Sau khi tính min và max ta sẽ kiểm tra
			// nếu min < 1 thì ta sẽ gán min = 1 và max bằng luôn range
			if (config.getMin() < 1) {
				config.setMin(1);
				config.setMax(config.getRange());
				// Ngược lại nếu min > tổng số trang
				// ta gán max = tổng số trang và min = (tổng số trang - range) +
				// 1
			} else if (config.getMax() > config.getTotalPage()) {
				config.setMax(config.getTotalPage());
				config.setMin(config.getTotalPage() - config.getRange() + 1);
			}
		}
	}

	/*
	 * Hàm lấy link theo trang
	 */
	private String link(Integer page) {
		if (page <= 1L && config.getLinkFirst() != "") {
			return config.getLinkFirst();
		}
		return config.getLinkFull().replace("{page}", page.toString());
	}

	/*
	 * Hàm lấy mã html Hàm này ban tạo giống theo giao diện của bạn tôi không có
	 * config nhiều vì rất rối Bạn thay đổi theo giao diện của bạn nhé
	 */
	public String html() {
		String p = "";
		// neu co nhieu hon 1 trang thi moi phan trang
		if (config.getTotalRecord() > config.getLimit()) {
			p = "<ul>";

			// Nút prev và first
			if (config.getCurrentPage() > 1) {
				p += "<li><a href=" + link(1) + "><<</a></li>";
				p += "<li><a href=" + link(config.getCurrentPage() - 1)
						+ "><</a></li>";
			}

			// lặp trong khoảng cách giữa min và max để hiển thị các nút
			for (int i = config.getMin().intValue(); i <= config.getMax(); i++) {
				// trang hien tai
				if (config.getCurrentPage() == i) {
					p += "<li><span>" + String.valueOf(i) + "</span></li>";

				} else {
					p += "<li><a href=" + link(i) + ">"
							+ String.valueOf(i) + "</a></li>";
				}
			}

			// nut last and next
			if (config.getCurrentPage() < config.getTotalPage()) {
				p += "<li><a href=" + link(config.getCurrentPage() + 1)
						+ ">></a></li>";
				p += "<li><a href=" + link(config.getTotalPage())
						+ ">>></a></li>";

			}
		}
		return p;
	}
}
